#pragma once

#include "noncopyable.h"

#include <memory>
#include <thread>
#include <functional>
#include <string>
#include <atomic>
#include <unistd.h>

//Thread类，每个Thread对象 记录的就是一个新线程的详细信息
class Thread : noncopyable
{
public:
    using ThreadFunc = std::function<void()>;

    explicit Thread(ThreadFunc, const std::string &name = std::string());   //缺省参数不能在定义和声明中同时给出
    ~Thread();

    void start();
    void join();

    //获取线程属性
    bool started() { return started_; }
    pid_t tid() { return tid_; }
    const std::string &name() { return name_; }

    static int numCreated() { return numCreated_; }

private:
    void setDefaultName();
    //标识新线程是否启动
    bool started_;
    //标识是否等待线程,当前线程等待其他线程完了再运行下去
    bool joined_;
    //定义一个thread的智能指针，需要启动时再创建线程。如果这里直接调用thread thread_它会立即创建一个新线程
    std::shared_ptr<std::thread> thread_;
    pid_t tid_;
    //线程函数
    ThreadFunc func_;  
    std::string name_;

    static std::atomic_int numCreated_;
    //static std::atomic<int> numCreated_; // 记录线程数量, 是线程安全的
};